{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Doc2Vec Model\n",
    "-------------------------------------\n",
    "\n",
    "In this example, we will download and preprocess the movie review data.\n",
    "\n",
    "From this data set we will compute/fit a Doc2Vec model to get document vectors.  From these document vectors, we will split the documents into train/test and use these doc vectors to do sentiment analysis on the movie review dataset.\n",
    "\n",
    "We start by loading the necessary libraries."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import random\n",
    "import os\n",
    "import pickle\n",
    "import string\n",
    "import requests\n",
    "import collections\n",
    "import io\n",
    "import tarfile\n",
    "import urllib.request\n",
    "import text_helpers\n",
    "from nltk.corpus import stopwords\n",
    "from tensorflow.python.framework import ops\n",
    "ops.reset_default_graph()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If a temporary data folder does not exist, create it for saving the trained doc2vec embeddings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Make a saving directory if it doesn't exist\n",
    "data_folder_name = 'temp'\n",
    "if not os.path.exists(data_folder_name):\n",
    "    os.makedirs(data_folder_name)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Start a computational graph session."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "sess = tf.Session()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we declare the model parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 500\n",
    "vocabulary_size = 7500\n",
    "generations = 100000\n",
    "model_learning_rate = 0.001\n",
    "\n",
    "embedding_size = 200   # Word embedding size\n",
    "doc_embedding_size = 100   # Document embedding size\n",
    "concatenated_size = embedding_size + doc_embedding_size\n",
    "\n",
    "num_sampled = int(batch_size/2)    # Number of negative examples to sample.\n",
    "window_size = 3       # How many words to consider to the left.\n",
    "\n",
    "# Add checkpoints to training\n",
    "save_embeddings_every = 5000\n",
    "print_valid_every = 5000\n",
    "print_loss_every = 100"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we declare stop words, validation test words, and normalize the review text."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Loading Data\n",
      "Normalizing Text Data\n",
      "Done.\n"
     ]
    }
   ],
   "source": [
    "# Declare stop words\n",
    "#stops = stopwords.words('english')\n",
    "stops = []\n",
    "\n",
    "# We pick a few test words for validation.\n",
    "valid_words = ['love', 'hate', 'happy', 'sad', 'man', 'woman']\n",
    "# Later we will have to transform these into indices\n",
    "\n",
    "# Load the movie review data\n",
    "print('Loading Data')\n",
    "texts, target = text_helpers.load_movie_data()\n",
    "\n",
    "# Normalize text\n",
    "print('Normalizing Text Data')\n",
    "texts = text_helpers.normalize_text(texts, stops)\n",
    "\n",
    "# Texts must contain at least 3 words\n",
    "target = [target[ix] for ix, x in enumerate(texts) if len(x.split()) > window_size]\n",
    "texts = [x for x in texts if len(x.split()) > window_size]    \n",
    "assert(len(target)==len(texts))\n",
    "print('Done.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we build our dictionary and transform the text data and validation words accordingly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Creating Dictionary\n",
      "Done.\n"
     ]
    }
   ],
   "source": [
    "# Build our data set and dictionaries\n",
    "print('Creating Dictionary')\n",
    "word_dictionary = text_helpers.build_dictionary(texts, vocabulary_size)\n",
    "word_dictionary_rev = dict(zip(word_dictionary.values(), word_dictionary.keys()))\n",
    "text_data = text_helpers.text_to_numbers(texts, word_dictionary)\n",
    "\n",
    "# Get validation word keys\n",
    "valid_examples = [word_dictionary[x] for x in valid_words]\n",
    "print('Done.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now create our doc2vec model.  There will be two embeddings, a word embedding and a document embedding.\n",
    "\n",
    "From these two embeddings, we add together the word embeddings and concatenate them to the document embeddings."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Creating Model\n",
      "Done.\n"
     ]
    }
   ],
   "source": [
    "print('Creating Model')\n",
    "# Define Embeddings:\n",
    "embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))\n",
    "doc_embeddings = tf.Variable(tf.random_uniform([len(texts), doc_embedding_size], -1.0, 1.0))\n",
    "\n",
    "# NCE loss parameters\n",
    "nce_weights = tf.Variable(tf.truncated_normal([vocabulary_size, concatenated_size],\n",
    "                                               stddev=1.0 / np.sqrt(concatenated_size)))\n",
    "nce_biases = tf.Variable(tf.zeros([vocabulary_size]))\n",
    "\n",
    "# Create data/target placeholders\n",
    "x_inputs = tf.placeholder(tf.int32, shape=[None, window_size + 1]) # plus 1 for doc index\n",
    "y_target = tf.placeholder(tf.int32, shape=[None, 1])\n",
    "valid_dataset = tf.constant(valid_examples, dtype=tf.int32)\n",
    "\n",
    "# Lookup the word embedding\n",
    "# Add together element embeddings in window:\n",
    "embed = tf.zeros([batch_size, embedding_size])\n",
    "for element in range(window_size):\n",
    "    embed += tf.nn.embedding_lookup(embeddings, x_inputs[:, element])\n",
    "\n",
    "doc_indices = tf.slice(x_inputs, [0,window_size],[batch_size,1])\n",
    "doc_embed = tf.nn.embedding_lookup(doc_embeddings,doc_indices)\n",
    "\n",
    "# concatenate embeddings\n",
    "final_embed = tf.concat(axis=1, values=[embed, tf.squeeze(doc_embed)])\n",
    "print('Done.')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we declare our loss function, optimization function, cosine similarity, model saving operations, and initialize the model variables."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Get loss from prediction\n",
    "loss = tf.reduce_mean(tf.nn.nce_loss(weights=nce_weights,\n",
    "                                     biases=nce_biases,\n",
    "                                     labels=y_target,\n",
    "                                     inputs=final_embed,\n",
    "                                     num_sampled=num_sampled,\n",
    "                                     num_classes=vocabulary_size))\n",
    "                                     \n",
    "# Create optimizer\n",
    "optimizer = tf.train.GradientDescentOptimizer(learning_rate=model_learning_rate)\n",
    "train_step = optimizer.minimize(loss)\n",
    "\n",
    "# Cosine similarity between words\n",
    "norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))\n",
    "normalized_embeddings = embeddings / norm\n",
    "valid_embeddings = tf.nn.embedding_lookup(normalized_embeddings, valid_dataset)\n",
    "similarity = tf.matmul(valid_embeddings, normalized_embeddings, transpose_b=True)\n",
    "\n",
    "# Create model saving operation\n",
    "saver = tf.train.Saver({\"embeddings\": embeddings, \"doc_embeddings\": doc_embeddings})\n",
    "\n",
    "#Add variable initializer.\n",
    "init = tf.global_variables_initializer()\n",
    "sess.run(init)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can train the doc2vec embedding model.  (This may take a while.  On a desktop computer with TensorFlow running on a CPU, it takes about 20-30 minutes to train the embedding.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Training\n",
      "Loss at step 100 : 618.0488891601562\n",
      "Loss at step 200 : 617.23876953125\n",
      "Loss at step 300 : 599.1314697265625\n",
      "Loss at step 400 : 570.5725708007812\n",
      "Loss at step 500 : 556.9442138671875\n",
      "Loss at step 600 : 530.82763671875\n",
      "Loss at step 700 : 559.087646484375\n",
      "Loss at step 800 : 550.006103515625\n",
      "Loss at step 900 : 510.2719421386719\n",
      "Loss at step 1000 : 498.8831787109375\n",
      "Loss at step 1100 : 471.5820617675781\n",
      "Loss at step 1200 : 494.06304931640625\n",
      "Loss at step 1300 : 424.6642150878906\n",
      "Loss at step 1400 : 434.5860595703125\n",
      "Loss at step 1500 : 471.4763488769531\n",
      "Loss at step 1600 : 392.48760986328125\n",
      "Loss at step 1700 : 426.09637451171875\n",
      "Loss at step 1800 : 396.0362548828125\n",
      "Loss at step 1900 : 380.9305114746094\n",
      "Loss at step 2000 : 311.42388916015625\n",
      "Loss at step 2100 : 363.8681945800781\n",
      "Loss at step 2200 : 352.4156188964844\n",
      "Loss at step 2300 : 397.03558349609375\n",
      "Loss at step 2400 : 315.4415588378906\n",
      "Loss at step 2500 : 318.6441955566406\n",
      "Loss at step 2600 : 305.4302978515625\n",
      "Loss at step 2700 : 300.1110534667969\n",
      "Loss at step 2800 : 282.31060791015625\n",
      "Loss at step 2900 : 325.2099914550781\n",
      "Loss at step 3000 : 261.5358581542969\n",
      "Loss at step 3100 : 265.1956787109375\n",
      "Loss at step 3200 : 242.9987335205078\n",
      "Loss at step 3300 : 245.44552612304688\n",
      "Loss at step 3400 : 215.45867919921875\n",
      "Loss at step 3500 : 238.2207794189453\n",
      "Loss at step 3600 : 228.61578369140625\n",
      "Loss at step 3700 : 253.09475708007812\n",
      "Loss at step 3800 : 258.4081115722656\n",
      "Loss at step 3900 : 223.69500732421875\n",
      "Loss at step 4000 : 179.26361083984375\n",
      "Loss at step 4100 : 215.80850219726562\n",
      "Loss at step 4200 : 149.47628784179688\n",
      "Loss at step 4300 : 188.426025390625\n",
      "Loss at step 4400 : 203.4141082763672\n",
      "Loss at step 4500 : 179.48602294921875\n",
      "Loss at step 4600 : 164.7634735107422\n",
      "Loss at step 4700 : 181.80355834960938\n",
      "Loss at step 4800 : 209.3821563720703\n",
      "Loss at step 4900 : 180.12474060058594\n",
      "Loss at step 5000 : 170.9027099609375\n",
      "Nearest to love: masala, unabashed, angle, foremost, vistas,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, staggeringly,\n",
      "Nearest to sad: set, parking, didnt, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, cho, predecessor, valiantly,\n",
      "Nearest to woman: school, auteuil, stumbles, si, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 5100 : 158.44619750976562\n",
      "Loss at step 5200 : 164.4249267578125\n",
      "Loss at step 5300 : 149.54319763183594\n",
      "Loss at step 5400 : 163.04776000976562\n",
      "Loss at step 5500 : 137.92820739746094\n",
      "Loss at step 5600 : 141.9955291748047\n",
      "Loss at step 5700 : 136.83993530273438\n",
      "Loss at step 5800 : 149.13575744628906\n",
      "Loss at step 5900 : 143.02590942382812\n",
      "Loss at step 6000 : 121.61951446533203\n",
      "Loss at step 6100 : 136.01535034179688\n",
      "Loss at step 6200 : 107.74507904052734\n",
      "Loss at step 6300 : 153.2751922607422\n",
      "Loss at step 6400 : 129.7838134765625\n",
      "Loss at step 6500 : 106.9393081665039\n",
      "Loss at step 6600 : 120.4563217163086\n",
      "Loss at step 6700 : 122.93274688720703\n",
      "Loss at step 6800 : 111.53326416015625\n",
      "Loss at step 6900 : 130.93667602539062\n",
      "Loss at step 7000 : 118.20126342773438\n",
      "Loss at step 7100 : 102.15925598144531\n",
      "Loss at step 7200 : 123.74687194824219\n",
      "Loss at step 7300 : 114.07636260986328\n",
      "Loss at step 7400 : 108.1265869140625\n",
      "Loss at step 7500 : 101.69820404052734\n",
      "Loss at step 7600 : 87.1402816772461\n",
      "Loss at step 7700 : 124.19905090332031\n",
      "Loss at step 7800 : 97.06109619140625\n",
      "Loss at step 7900 : 106.81552124023438\n",
      "Loss at step 8000 : 96.88636779785156\n",
      "Loss at step 8100 : 99.1224365234375\n",
      "Loss at step 8200 : 123.09528350830078\n",
      "Loss at step 8300 : 103.31806182861328\n",
      "Loss at step 8400 : 96.0549087524414\n",
      "Loss at step 8500 : 88.96345520019531\n",
      "Loss at step 8600 : 95.27356719970703\n",
      "Loss at step 8700 : 73.4681396484375\n",
      "Loss at step 8800 : 94.4031753540039\n",
      "Loss at step 8900 : 87.28780364990234\n",
      "Loss at step 9000 : 89.73848724365234\n",
      "Loss at step 9100 : 105.6384506225586\n",
      "Loss at step 9200 : 81.85738372802734\n",
      "Loss at step 9300 : 86.1482162475586\n",
      "Loss at step 9400 : 115.8003158569336\n",
      "Loss at step 9500 : 93.81412506103516\n",
      "Loss at step 9600 : 103.75859069824219\n",
      "Loss at step 9700 : 79.75733947753906\n",
      "Loss at step 9800 : 94.78793334960938\n",
      "Loss at step 9900 : 62.03213119506836\n",
      "Loss at step 10000 : 77.86557006835938\n",
      "Nearest to love: masala, unabashed, vistas, foremost, angle,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, staggeringly,\n",
      "Nearest to sad: set, parking, didnt, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, cho, predecessor, glass,\n",
      "Nearest to woman: school, auteuil, stumbles, si, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 10100 : 77.0138931274414\n",
      "Loss at step 10200 : 71.36318969726562\n",
      "Loss at step 10300 : 83.24344635009766\n",
      "Loss at step 10400 : 99.3774642944336\n",
      "Loss at step 10500 : 89.53713989257812\n",
      "Loss at step 10600 : 70.0913314819336\n",
      "Loss at step 10700 : 82.39799499511719\n",
      "Loss at step 10800 : 88.07225036621094\n",
      "Loss at step 10900 : 65.69876861572266\n",
      "Loss at step 11000 : 71.10816955566406\n",
      "Loss at step 11100 : 90.11366271972656\n",
      "Loss at step 11200 : 78.41493225097656\n",
      "Loss at step 11300 : 60.251766204833984\n",
      "Loss at step 11400 : 70.5859603881836\n",
      "Loss at step 11500 : 78.0897216796875\n",
      "Loss at step 11600 : 91.1495590209961\n",
      "Loss at step 11700 : 86.89717102050781\n",
      "Loss at step 11800 : 74.19237518310547\n",
      "Loss at step 11900 : 77.25936126708984\n",
      "Loss at step 12000 : 76.84115600585938\n",
      "Loss at step 12100 : 66.22502899169922\n",
      "Loss at step 12200 : 53.61240005493164\n",
      "Loss at step 12300 : 70.57964324951172\n",
      "Loss at step 12400 : 75.08812713623047\n",
      "Loss at step 12500 : 63.50859832763672\n",
      "Loss at step 12600 : 66.39698791503906\n",
      "Loss at step 12700 : 86.8819351196289\n",
      "Loss at step 12800 : 79.13404846191406\n",
      "Loss at step 12900 : 67.34290313720703\n",
      "Loss at step 13000 : 62.25332260131836\n",
      "Loss at step 13100 : 82.99136352539062\n",
      "Loss at step 13200 : 67.68949127197266\n",
      "Loss at step 13300 : 70.00431060791016\n",
      "Loss at step 13400 : 57.690635681152344\n",
      "Loss at step 13500 : 58.58692169189453\n",
      "Loss at step 13600 : 72.89476776123047\n",
      "Loss at step 13700 : 53.780391693115234\n",
      "Loss at step 13800 : 69.70446014404297\n",
      "Loss at step 13900 : 74.83673095703125\n",
      "Loss at step 14000 : 58.87015151977539\n",
      "Loss at step 14100 : 65.60189056396484\n",
      "Loss at step 14200 : 69.37165832519531\n",
      "Loss at step 14300 : 62.460567474365234\n",
      "Loss at step 14400 : 69.88143920898438\n",
      "Loss at step 14500 : 69.19136047363281\n",
      "Loss at step 14600 : 62.47692108154297\n",
      "Loss at step 14700 : 52.98305892944336\n",
      "Loss at step 14800 : 63.210445404052734\n",
      "Loss at step 14900 : 61.44493865966797\n",
      "Loss at step 15000 : 75.54259490966797\n",
      "Nearest to love: masala, unabashed, vistas, foremost, visual,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, parking, didnt, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, cho, glass, valiantly,\n",
      "Nearest to woman: school, auteuil, stumbles, si, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 15100 : 63.1845588684082\n",
      "Loss at step 15200 : 58.398948669433594\n",
      "Loss at step 15300 : 55.19811248779297\n",
      "Loss at step 15400 : 55.66953659057617\n",
      "Loss at step 15500 : 69.85836791992188\n",
      "Loss at step 15600 : 61.89970397949219\n",
      "Loss at step 15700 : 52.47340774536133\n",
      "Loss at step 15800 : 63.34888458251953\n",
      "Loss at step 15900 : 58.54664611816406\n",
      "Loss at step 16000 : 65.14337921142578\n",
      "Loss at step 16100 : 64.49205017089844\n",
      "Loss at step 16200 : 63.239078521728516\n",
      "Loss at step 16300 : 63.376712799072266\n",
      "Loss at step 16400 : 66.20431518554688\n",
      "Loss at step 16500 : 61.79240798950195\n",
      "Loss at step 16600 : 45.11497497558594\n",
      "Loss at step 16700 : 50.345123291015625\n",
      "Loss at step 16800 : 52.37607192993164\n",
      "Loss at step 16900 : 56.1355094909668\n",
      "Loss at step 17000 : 64.78409576416016\n",
      "Loss at step 17100 : 54.47688293457031\n",
      "Loss at step 17200 : 60.200313568115234\n",
      "Loss at step 17300 : 66.62704467773438\n",
      "Loss at step 17400 : 54.50339889526367\n",
      "Loss at step 17500 : 53.76880645751953\n",
      "Loss at step 17600 : 39.951534271240234\n",
      "Loss at step 17700 : 65.48619842529297\n",
      "Loss at step 17800 : 49.10087203979492\n",
      "Loss at step 17900 : 50.61709213256836\n",
      "Loss at step 18000 : 44.283180236816406\n",
      "Loss at step 18100 : 62.9136962890625\n",
      "Loss at step 18200 : 52.48782730102539\n",
      "Loss at step 18300 : 75.8030776977539\n",
      "Loss at step 18400 : 42.3542366027832\n",
      "Loss at step 18500 : 39.8822135925293\n",
      "Loss at step 18600 : 48.99156188964844\n",
      "Loss at step 18700 : 50.7600212097168\n",
      "Loss at step 18800 : 57.72874069213867\n",
      "Loss at step 18900 : 44.22684860229492\n",
      "Loss at step 19000 : 47.65475082397461\n",
      "Loss at step 19100 : 54.00833511352539\n",
      "Loss at step 19200 : 45.53310775756836\n",
      "Loss at step 19300 : 54.198875427246094\n",
      "Loss at step 19400 : 44.865909576416016\n",
      "Loss at step 19500 : 56.52061080932617\n",
      "Loss at step 19600 : 50.64605712890625\n",
      "Loss at step 19700 : 57.1083984375\n",
      "Loss at step 19800 : 61.52809143066406\n",
      "Loss at step 19900 : 54.029659271240234\n",
      "Loss at step 20000 : 62.03146743774414\n",
      "Nearest to love: masala, unabashed, vistas, foremost, visual,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, parking, didnt, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, cho, glass, valiantly,\n",
      "Nearest to woman: school, auteuil, stumbles, si, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 20100 : 51.92283630371094\n",
      "Loss at step 20200 : 52.511131286621094\n",
      "Loss at step 20300 : 54.235660552978516\n",
      "Loss at step 20400 : 44.52399444580078\n",
      "Loss at step 20500 : 66.1422348022461\n",
      "Loss at step 20600 : 49.16237258911133\n",
      "Loss at step 20700 : 49.156822204589844\n",
      "Loss at step 20800 : 45.20671844482422\n",
      "Loss at step 20900 : 40.36821746826172\n",
      "Loss at step 21000 : 58.65716552734375\n",
      "Loss at step 21100 : 47.86164474487305\n",
      "Loss at step 21200 : 51.55767822265625\n",
      "Loss at step 21300 : 39.84978103637695\n",
      "Loss at step 21400 : 52.37902069091797\n",
      "Loss at step 21500 : 33.307674407958984\n",
      "Loss at step 21600 : 45.91781234741211\n",
      "Loss at step 21700 : 53.02955627441406\n",
      "Loss at step 21800 : 50.553768157958984\n",
      "Loss at step 21900 : 36.722740173339844\n",
      "Loss at step 22000 : 49.919673919677734\n",
      "Loss at step 22100 : 42.59901428222656\n",
      "Loss at step 22200 : 52.61808776855469\n",
      "Loss at step 22300 : 45.65885925292969\n",
      "Loss at step 22400 : 37.799259185791016\n",
      "Loss at step 22500 : 51.73858642578125\n",
      "Loss at step 22600 : 43.88180923461914\n",
      "Loss at step 22700 : 40.98052978515625\n",
      "Loss at step 22800 : 37.44224548339844\n",
      "Loss at step 22900 : 43.548614501953125\n",
      "Loss at step 23000 : 29.441259384155273\n",
      "Loss at step 23100 : 54.66054916381836\n",
      "Loss at step 23200 : 49.167015075683594\n",
      "Loss at step 23300 : 44.23128128051758\n",
      "Loss at step 23400 : 44.739524841308594\n",
      "Loss at step 23500 : 50.475608825683594\n",
      "Loss at step 23600 : 38.75091552734375\n",
      "Loss at step 23700 : 46.18939208984375\n",
      "Loss at step 23800 : 42.2397575378418\n",
      "Loss at step 23900 : 53.489803314208984\n",
      "Loss at step 24000 : 48.93730926513672\n",
      "Loss at step 24100 : 47.03376770019531\n",
      "Loss at step 24200 : 36.20834732055664\n",
      "Loss at step 24300 : 49.115665435791016\n",
      "Loss at step 24400 : 48.01439666748047\n",
      "Loss at step 24500 : 52.651527404785156\n",
      "Loss at step 24600 : 46.00444030761719\n",
      "Loss at step 24700 : 40.49055480957031\n",
      "Loss at step 24800 : 42.33845138549805\n",
      "Loss at step 24900 : 36.09087371826172\n",
      "Loss at step 25000 : 39.3194465637207\n",
      "Nearest to love: masala, unabashed, vistas, visual, are,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, cho, glass, valiantly,\n",
      "Nearest to woman: school, auteuil, si, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 25100 : 35.45134353637695\n",
      "Loss at step 25200 : 35.25654983520508\n",
      "Loss at step 25300 : 37.009010314941406\n",
      "Loss at step 25400 : 34.0068359375\n",
      "Loss at step 25500 : 41.20083236694336\n",
      "Loss at step 25600 : 44.501564025878906\n",
      "Loss at step 25700 : 38.55746078491211\n",
      "Loss at step 25800 : 39.718894958496094\n",
      "Loss at step 25900 : 37.07023620605469\n",
      "Loss at step 26000 : 41.98994827270508\n",
      "Loss at step 26100 : 36.86017990112305\n",
      "Loss at step 26200 : 44.038238525390625\n",
      "Loss at step 26300 : 35.6402587890625\n",
      "Loss at step 26400 : 48.986358642578125\n",
      "Loss at step 26500 : 39.49319839477539\n",
      "Loss at step 26600 : 37.85643768310547\n",
      "Loss at step 26700 : 38.509361267089844\n",
      "Loss at step 26800 : 45.05925750732422\n",
      "Loss at step 26900 : 44.54390335083008\n",
      "Loss at step 27000 : 41.87226486206055\n",
      "Loss at step 27100 : 34.558006286621094\n",
      "Loss at step 27200 : 40.740047454833984\n",
      "Loss at step 27300 : 42.71868896484375\n",
      "Loss at step 27400 : 46.69533157348633\n",
      "Loss at step 27500 : 38.63947677612305\n",
      "Loss at step 27600 : 42.683921813964844\n",
      "Loss at step 27700 : 37.84663009643555\n",
      "Loss at step 27800 : 42.709815979003906\n",
      "Loss at step 27900 : 31.30149269104004\n",
      "Loss at step 28000 : 39.16078186035156\n",
      "Loss at step 28100 : 40.025596618652344\n",
      "Loss at step 28200 : 40.374229431152344\n",
      "Loss at step 28300 : 40.28290557861328\n",
      "Loss at step 28400 : 45.064334869384766\n",
      "Loss at step 28500 : 44.16975021362305\n",
      "Loss at step 28600 : 40.02341842651367\n",
      "Loss at step 28700 : 47.32308578491211\n",
      "Loss at step 28800 : 38.984107971191406\n",
      "Loss at step 28900 : 33.9261474609375\n",
      "Loss at step 29000 : 45.957027435302734\n",
      "Loss at step 29100 : 50.15705490112305\n",
      "Loss at step 29200 : 44.39296340942383\n",
      "Loss at step 29300 : 42.98170471191406\n",
      "Loss at step 29400 : 42.78678894042969\n",
      "Loss at step 29500 : 39.511295318603516\n",
      "Loss at step 29600 : 39.5526237487793\n",
      "Loss at step 29700 : 52.09275436401367\n",
      "Loss at step 29800 : 43.455196380615234\n",
      "Loss at step 29900 : 45.895179748535156\n",
      "Loss at step 30000 : 38.036537170410156\n",
      "Nearest to love: masala, unabashed, are, vistas, to,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, cho, glass, valiantly,\n",
      "Nearest to woman: school, auteuil, si, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 30100 : 36.93171310424805\n",
      "Loss at step 30200 : 31.84267807006836\n",
      "Loss at step 30300 : 34.43117904663086\n",
      "Loss at step 30400 : 39.65788650512695\n",
      "Loss at step 30500 : 39.13357162475586\n",
      "Loss at step 30600 : 43.317970275878906\n",
      "Loss at step 30700 : 32.78807830810547\n",
      "Loss at step 30800 : 31.631284713745117\n",
      "Loss at step 30900 : 49.024017333984375\n",
      "Loss at step 31000 : 37.20657730102539\n",
      "Loss at step 31100 : 44.17254638671875\n",
      "Loss at step 31200 : 43.02642822265625\n",
      "Loss at step 31300 : 39.892539978027344\n",
      "Loss at step 31400 : 41.711326599121094\n",
      "Loss at step 31500 : 26.313762664794922\n",
      "Loss at step 31600 : 43.83277130126953\n",
      "Loss at step 31700 : 45.02095413208008\n",
      "Loss at step 31800 : 38.934749603271484\n",
      "Loss at step 31900 : 32.16179656982422\n",
      "Loss at step 32000 : 35.69550704956055\n",
      "Loss at step 32100 : 30.039995193481445\n",
      "Loss at step 32200 : 36.143959045410156\n",
      "Loss at step 32300 : 37.37643814086914\n",
      "Loss at step 32400 : 43.26710510253906\n",
      "Loss at step 32500 : 39.3355712890625\n",
      "Loss at step 32600 : 49.91241455078125\n",
      "Loss at step 32700 : 27.834941864013672\n",
      "Loss at step 32800 : 39.02912902832031\n",
      "Loss at step 32900 : 33.691951751708984\n",
      "Loss at step 33000 : 33.233734130859375\n",
      "Loss at step 33100 : 37.24979782104492\n",
      "Loss at step 33200 : 30.421470642089844\n",
      "Loss at step 33300 : 35.36021041870117\n",
      "Loss at step 33400 : 36.26604080200195\n",
      "Loss at step 33500 : 33.79851531982422\n",
      "Loss at step 33600 : 41.39692687988281\n",
      "Loss at step 33700 : 51.293296813964844\n",
      "Loss at step 33800 : 37.52687454223633\n",
      "Loss at step 33900 : 45.90592956542969\n",
      "Loss at step 34000 : 38.146934509277344\n",
      "Loss at step 34100 : 36.25141906738281\n",
      "Loss at step 34200 : 31.220399856567383\n",
      "Loss at step 34300 : 29.953598022460938\n",
      "Loss at step 34400 : 32.39493179321289\n",
      "Loss at step 34500 : 44.61451721191406\n",
      "Loss at step 34600 : 37.34035873413086\n",
      "Loss at step 34700 : 36.140132904052734\n",
      "Loss at step 34800 : 43.909507751464844\n",
      "Loss at step 34900 : 33.68388366699219\n",
      "Loss at step 35000 : 35.278648376464844\n",
      "Nearest to love: are, to, masala, unabashed, a,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, cho, glass, comic,\n",
      "Nearest to woman: school, auteuil, si, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 35100 : 37.038368225097656\n",
      "Loss at step 35200 : 27.68008804321289\n",
      "Loss at step 35300 : 31.496313095092773\n",
      "Loss at step 35400 : 34.185123443603516\n",
      "Loss at step 35500 : 30.932191848754883\n",
      "Loss at step 35600 : 40.53662872314453\n",
      "Loss at step 35700 : 34.497047424316406\n",
      "Loss at step 35800 : 28.360258102416992\n",
      "Loss at step 35900 : 35.615360260009766\n",
      "Loss at step 36000 : 34.44438934326172\n",
      "Loss at step 36100 : 37.1646842956543\n",
      "Loss at step 36200 : 28.94765281677246\n",
      "Loss at step 36300 : 37.794490814208984\n",
      "Loss at step 36400 : 37.620460510253906\n",
      "Loss at step 36500 : 48.83534240722656\n",
      "Loss at step 36600 : 26.213764190673828\n",
      "Loss at step 36700 : 32.74320983886719\n",
      "Loss at step 36800 : 34.80481719970703\n",
      "Loss at step 36900 : 22.301172256469727\n",
      "Loss at step 37000 : 41.68021011352539\n",
      "Loss at step 37100 : 43.8163948059082\n",
      "Loss at step 37200 : 37.93112564086914\n",
      "Loss at step 37300 : 29.849117279052734\n",
      "Loss at step 37400 : 32.242584228515625\n",
      "Loss at step 37500 : 34.5549201965332\n",
      "Loss at step 37600 : 33.74958801269531\n",
      "Loss at step 37700 : 28.95349884033203\n",
      "Loss at step 37800 : 33.60817337036133\n",
      "Loss at step 37900 : 32.934932708740234\n",
      "Loss at step 38000 : 37.345245361328125\n",
      "Loss at step 38100 : 33.297637939453125\n",
      "Loss at step 38200 : 30.668476104736328\n",
      "Loss at step 38300 : 35.23506164550781\n",
      "Loss at step 38400 : 38.58863067626953\n",
      "Loss at step 38500 : 43.90892791748047\n",
      "Loss at step 38600 : 37.504703521728516\n",
      "Loss at step 38700 : 33.99909973144531\n",
      "Loss at step 38800 : 38.0034065246582\n",
      "Loss at step 38900 : 30.21689224243164\n",
      "Loss at step 39000 : 32.79741287231445\n",
      "Loss at step 39100 : 24.563949584960938\n",
      "Loss at step 39200 : 30.541658401489258\n",
      "Loss at step 39300 : 26.29023551940918\n",
      "Loss at step 39400 : 25.28965187072754\n",
      "Loss at step 39500 : 34.33436584472656\n",
      "Loss at step 39600 : 36.15377426147461\n",
      "Loss at step 39700 : 30.30072593688965\n",
      "Loss at step 39800 : 38.0841178894043\n",
      "Loss at step 39900 : 45.59693908691406\n",
      "Loss at step 40000 : 28.437393188476562\n",
      "Nearest to love: are, to, a, masala, unabashed,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, cho, glass, comic,\n",
      "Nearest to woman: school, auteuil, si, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 40100 : 31.262468338012695\n",
      "Loss at step 40200 : 40.57231521606445\n",
      "Loss at step 40300 : 24.022136688232422\n",
      "Loss at step 40400 : 29.417781829833984\n",
      "Loss at step 40500 : 40.37506866455078\n",
      "Loss at step 40600 : 34.126312255859375\n",
      "Loss at step 40700 : 29.481782913208008\n",
      "Loss at step 40800 : 29.530508041381836\n",
      "Loss at step 40900 : 28.679920196533203\n",
      "Loss at step 41000 : 44.42243576049805\n",
      "Loss at step 41100 : 31.696128845214844\n",
      "Loss at step 41200 : 39.639434814453125\n",
      "Loss at step 41300 : 36.13264083862305\n",
      "Loss at step 41400 : 39.24892807006836\n",
      "Loss at step 41500 : 41.147274017333984\n",
      "Loss at step 41600 : 30.423860549926758\n",
      "Loss at step 41700 : 28.920196533203125\n",
      "Loss at step 41800 : 31.655012130737305\n",
      "Loss at step 41900 : 29.86532211303711\n",
      "Loss at step 42000 : 40.80308532714844\n",
      "Loss at step 42100 : 31.82338523864746\n",
      "Loss at step 42200 : 29.650012969970703\n",
      "Loss at step 42300 : 28.39533042907715\n",
      "Loss at step 42400 : 25.643497467041016\n",
      "Loss at step 42500 : 39.35073471069336\n",
      "Loss at step 42600 : 31.797386169433594\n",
      "Loss at step 42700 : 37.24545669555664\n",
      "Loss at step 42800 : 24.453935623168945\n",
      "Loss at step 42900 : 29.692655563354492\n",
      "Loss at step 43000 : 38.954227447509766\n",
      "Loss at step 43100 : 34.775733947753906\n",
      "Loss at step 43200 : 35.82271957397461\n",
      "Loss at step 43300 : 25.270597457885742\n",
      "Loss at step 43400 : 27.176130294799805\n",
      "Loss at step 43500 : 34.75946807861328\n",
      "Loss at step 43600 : 30.264108657836914\n",
      "Loss at step 43700 : 30.00868797302246\n",
      "Loss at step 43800 : 25.221567153930664\n",
      "Loss at step 43900 : 33.35398864746094\n",
      "Loss at step 44000 : 27.743732452392578\n",
      "Loss at step 44100 : 32.203712463378906\n",
      "Loss at step 44200 : 26.23908233642578\n",
      "Loss at step 44300 : 24.693729400634766\n",
      "Loss at step 44400 : 32.014583587646484\n",
      "Loss at step 44500 : 33.099327087402344\n",
      "Loss at step 44600 : 30.785659790039062\n",
      "Loss at step 44700 : 27.411605834960938\n",
      "Loss at step 44800 : 32.37639236450195\n",
      "Loss at step 44900 : 33.69813919067383\n",
      "Loss at step 45000 : 26.7861270904541\n",
      "Nearest to love: are, to, a, with, visual,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, cho, glass, comic,\n",
      "Nearest to woman: school, auteuil, si, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 45100 : 34.10911178588867\n",
      "Loss at step 45200 : 31.89720344543457\n",
      "Loss at step 45300 : 30.99603843688965\n",
      "Loss at step 45400 : 26.869173049926758\n",
      "Loss at step 45500 : 38.81137466430664\n",
      "Loss at step 45600 : 34.30391311645508\n",
      "Loss at step 45700 : 31.946054458618164\n",
      "Loss at step 45800 : 33.1872673034668\n",
      "Loss at step 45900 : 24.16689682006836\n",
      "Loss at step 46000 : 42.45048141479492\n",
      "Loss at step 46100 : 28.306964874267578\n",
      "Loss at step 46200 : 20.771343231201172\n",
      "Loss at step 46300 : 26.69701385498047\n",
      "Loss at step 46400 : 26.06058120727539\n",
      "Loss at step 46500 : 29.03485679626465\n",
      "Loss at step 46600 : 25.738740921020508\n",
      "Loss at step 46700 : 27.941356658935547\n",
      "Loss at step 46800 : 24.6170597076416\n",
      "Loss at step 46900 : 21.782140731811523\n",
      "Loss at step 47000 : 35.29143524169922\n",
      "Loss at step 47100 : 33.5119514465332\n",
      "Loss at step 47200 : 28.071012496948242\n",
      "Loss at step 47300 : 40.08955764770508\n",
      "Loss at step 47400 : 26.393230438232422\n",
      "Loss at step 47500 : 33.576725006103516\n",
      "Loss at step 47600 : 26.83869743347168\n",
      "Loss at step 47700 : 22.685728073120117\n",
      "Loss at step 47800 : 25.4384708404541\n",
      "Loss at step 47900 : 24.092132568359375\n",
      "Loss at step 48000 : 40.49053955078125\n",
      "Loss at step 48100 : 20.481887817382812\n",
      "Loss at step 48200 : 32.23769760131836\n",
      "Loss at step 48300 : 30.021276473999023\n",
      "Loss at step 48400 : 29.140209197998047\n",
      "Loss at step 48500 : 26.317245483398438\n",
      "Loss at step 48600 : 27.350357055664062\n",
      "Loss at step 48700 : 27.931446075439453\n",
      "Loss at step 48800 : 28.360034942626953\n",
      "Loss at step 48900 : 29.340017318725586\n",
      "Loss at step 49000 : 25.589359283447266\n",
      "Loss at step 49100 : 25.9069881439209\n",
      "Loss at step 49200 : 32.13025665283203\n",
      "Loss at step 49300 : 31.057743072509766\n",
      "Loss at step 49400 : 32.23312759399414\n",
      "Loss at step 49500 : 20.327869415283203\n",
      "Loss at step 49600 : 32.09927749633789\n",
      "Loss at step 49700 : 31.363677978515625\n",
      "Loss at step 49800 : 26.28035545349121\n",
      "Loss at step 49900 : 44.50318908691406\n",
      "Loss at step 50000 : 27.962596893310547\n",
      "Nearest to love: are, to, a, with, RARE,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, comic, cho, glass,\n",
      "Nearest to woman: school, auteuil, si, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 50100 : 29.651317596435547\n",
      "Loss at step 50200 : 35.494102478027344\n",
      "Loss at step 50300 : 34.502357482910156\n",
      "Loss at step 50400 : 36.471710205078125\n",
      "Loss at step 50500 : 22.65896224975586\n",
      "Loss at step 50600 : 29.950037002563477\n",
      "Loss at step 50700 : 31.915849685668945\n",
      "Loss at step 50800 : 17.687931060791016\n",
      "Loss at step 50900 : 24.35459327697754\n",
      "Loss at step 51000 : 34.02640151977539\n",
      "Loss at step 51100 : 29.284082412719727\n",
      "Loss at step 51200 : 27.36629295349121\n",
      "Loss at step 51300 : 29.836721420288086\n",
      "Loss at step 51400 : 29.83894920349121\n",
      "Loss at step 51500 : 23.450471878051758\n",
      "Loss at step 51600 : 22.286104202270508\n",
      "Loss at step 51700 : 21.294267654418945\n",
      "Loss at step 51800 : 28.124300003051758\n",
      "Loss at step 51900 : 27.37312126159668\n",
      "Loss at step 52000 : 30.015077590942383\n",
      "Loss at step 52100 : 18.534645080566406\n",
      "Loss at step 52200 : 30.59803581237793\n",
      "Loss at step 52300 : 27.179824829101562\n",
      "Loss at step 52400 : 22.626087188720703\n",
      "Loss at step 52500 : 26.4210147857666\n",
      "Loss at step 52600 : 24.80034065246582\n",
      "Loss at step 52700 : 33.65114212036133\n",
      "Loss at step 52800 : 23.754867553710938\n",
      "Loss at step 52900 : 34.98509216308594\n",
      "Loss at step 53000 : 26.558034896850586\n",
      "Loss at step 53100 : 25.71915626525879\n",
      "Loss at step 53200 : 39.97705841064453\n",
      "Loss at step 53300 : 36.376190185546875\n",
      "Loss at step 53400 : 25.789386749267578\n",
      "Loss at step 53500 : 34.971412658691406\n",
      "Loss at step 53600 : 32.47920227050781\n",
      "Loss at step 53700 : 27.48377799987793\n",
      "Loss at step 53800 : 31.94778823852539\n",
      "Loss at step 53900 : 22.37890625\n",
      "Loss at step 54000 : 27.842615127563477\n",
      "Loss at step 54100 : 28.630348205566406\n",
      "Loss at step 54200 : 20.23816680908203\n",
      "Loss at step 54300 : 20.768922805786133\n",
      "Loss at step 54400 : 26.311922073364258\n",
      "Loss at step 54500 : 21.64339256286621\n",
      "Loss at step 54600 : 28.93830108642578\n",
      "Loss at step 54700 : 18.241968154907227\n",
      "Loss at step 54800 : 26.633142471313477\n",
      "Loss at step 54900 : 23.595609664916992\n",
      "Loss at step 55000 : 27.404312133789062\n",
      "Nearest to love: to, are, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, comic, cho, glass,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 55100 : 31.326366424560547\n",
      "Loss at step 55200 : 31.941682815551758\n",
      "Loss at step 55300 : 27.513065338134766\n",
      "Loss at step 55400 : 28.425573348999023\n",
      "Loss at step 55500 : 22.19107437133789\n",
      "Loss at step 55600 : 27.384878158569336\n",
      "Loss at step 55700 : 26.288881301879883\n",
      "Loss at step 55800 : 23.476472854614258\n",
      "Loss at step 55900 : 25.176015853881836\n",
      "Loss at step 56000 : 22.52934455871582\n",
      "Loss at step 56100 : 26.102293014526367\n",
      "Loss at step 56200 : 30.816333770751953\n",
      "Loss at step 56300 : 22.51125717163086\n",
      "Loss at step 56400 : 24.40707015991211\n",
      "Loss at step 56500 : 28.498579025268555\n",
      "Loss at step 56600 : 31.510786056518555\n",
      "Loss at step 56700 : 23.472476959228516\n",
      "Loss at step 56800 : 26.813884735107422\n",
      "Loss at step 56900 : 27.020099639892578\n",
      "Loss at step 57000 : 21.928010940551758\n",
      "Loss at step 57100 : 28.498207092285156\n",
      "Loss at step 57200 : 30.88417625427246\n",
      "Loss at step 57300 : 43.65937423706055\n",
      "Loss at step 57400 : 28.680301666259766\n",
      "Loss at step 57500 : 24.653589248657227\n",
      "Loss at step 57600 : 25.260732650756836\n",
      "Loss at step 57700 : 24.76978874206543\n",
      "Loss at step 57800 : 25.241262435913086\n",
      "Loss at step 57900 : 24.638103485107422\n",
      "Loss at step 58000 : 21.439128875732422\n",
      "Loss at step 58100 : 22.20937728881836\n",
      "Loss at step 58200 : 22.11101531982422\n",
      "Loss at step 58300 : 25.11914825439453\n",
      "Loss at step 58400 : 34.1190299987793\n",
      "Loss at step 58500 : 27.207759857177734\n",
      "Loss at step 58600 : 27.12860679626465\n",
      "Loss at step 58700 : 26.930015563964844\n",
      "Loss at step 58800 : 23.377180099487305\n",
      "Loss at step 58900 : 25.10162925720215\n",
      "Loss at step 59000 : 28.81622314453125\n",
      "Loss at step 59100 : 27.44376564025879\n",
      "Loss at step 59200 : 19.418058395385742\n",
      "Loss at step 59300 : 21.81368637084961\n",
      "Loss at step 59400 : 24.826065063476562\n",
      "Loss at step 59500 : 28.098669052124023\n",
      "Loss at step 59600 : 27.974441528320312\n",
      "Loss at step 59700 : 25.618133544921875\n",
      "Loss at step 59800 : 21.152854919433594\n",
      "Loss at step 59900 : 23.058677673339844\n",
      "Loss at step 60000 : 24.328041076660156\n",
      "Nearest to love: to, are, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, equals, lazy, las,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, comic, to, no,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 60100 : 23.179956436157227\n",
      "Loss at step 60200 : 26.0114688873291\n",
      "Loss at step 60300 : 26.55317497253418\n",
      "Loss at step 60400 : 27.929323196411133\n",
      "Loss at step 60500 : 22.366188049316406\n",
      "Loss at step 60600 : 24.912891387939453\n",
      "Loss at step 60700 : 23.59541130065918\n",
      "Loss at step 60800 : 21.88314437866211\n",
      "Loss at step 60900 : 26.021268844604492\n",
      "Loss at step 61000 : 22.837247848510742\n",
      "Loss at step 61100 : 21.474781036376953\n",
      "Loss at step 61200 : 23.357425689697266\n",
      "Loss at step 61300 : 35.910160064697266\n",
      "Loss at step 61400 : 27.739011764526367\n",
      "Loss at step 61500 : 18.448341369628906\n",
      "Loss at step 61600 : 23.806964874267578\n",
      "Loss at step 61700 : 23.2415714263916\n",
      "Loss at step 61800 : 25.551376342773438\n",
      "Loss at step 61900 : 28.453174591064453\n",
      "Loss at step 62000 : 26.274551391601562\n",
      "Loss at step 62100 : 22.41958236694336\n",
      "Loss at step 62200 : 26.549087524414062\n",
      "Loss at step 62300 : 16.99793815612793\n",
      "Loss at step 62400 : 15.608729362487793\n",
      "Loss at step 62500 : 27.025585174560547\n",
      "Loss at step 62600 : 23.287317276000977\n",
      "Loss at step 62700 : 27.606218338012695\n",
      "Loss at step 62800 : 28.511573791503906\n",
      "Loss at step 62900 : 26.37687873840332\n",
      "Loss at step 63000 : 21.822139739990234\n",
      "Loss at step 63100 : 25.281843185424805\n",
      "Loss at step 63200 : 26.78995704650879\n",
      "Loss at step 63300 : 26.680469512939453\n",
      "Loss at step 63400 : 24.903934478759766\n",
      "Loss at step 63500 : 24.117929458618164\n",
      "Loss at step 63600 : 30.567293167114258\n",
      "Loss at step 63700 : 24.159360885620117\n",
      "Loss at step 63800 : 29.79962921142578\n",
      "Loss at step 63900 : 22.017391204833984\n",
      "Loss at step 64000 : 28.35663414001465\n",
      "Loss at step 64100 : 25.280593872070312\n",
      "Loss at step 64200 : 27.028928756713867\n",
      "Loss at step 64300 : 18.517004013061523\n",
      "Loss at step 64400 : 27.63762092590332\n",
      "Loss at step 64500 : 23.54515266418457\n",
      "Loss at step 64600 : 20.374202728271484\n",
      "Loss at step 64700 : 16.605859756469727\n",
      "Loss at step 64800 : 24.207307815551758\n",
      "Loss at step 64900 : 28.490175247192383\n",
      "Loss at step 65000 : 19.14027976989746\n",
      "Nearest to love: to, are, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, las, lazy, equals,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, to, comic, no,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 65100 : 16.0816650390625\n",
      "Loss at step 65200 : 29.87810516357422\n",
      "Loss at step 65300 : 22.699024200439453\n",
      "Loss at step 65400 : 18.920772552490234\n",
      "Loss at step 65500 : 19.565746307373047\n",
      "Loss at step 65600 : 24.754056930541992\n",
      "Loss at step 65700 : 36.34669876098633\n",
      "Loss at step 65800 : 19.595836639404297\n",
      "Loss at step 65900 : 29.194477081298828\n",
      "Loss at step 66000 : 17.828468322753906\n",
      "Loss at step 66100 : 32.325592041015625\n",
      "Loss at step 66200 : 21.068727493286133\n",
      "Loss at step 66300 : 24.19225311279297\n",
      "Loss at step 66400 : 31.18352699279785\n",
      "Loss at step 66500 : 21.37700653076172\n",
      "Loss at step 66600 : 24.335739135742188\n",
      "Loss at step 66700 : 22.14603042602539\n",
      "Loss at step 66800 : 20.063541412353516\n",
      "Loss at step 66900 : 25.73876190185547\n",
      "Loss at step 67000 : 21.433767318725586\n",
      "Loss at step 67100 : 20.40151596069336\n",
      "Loss at step 67200 : 24.44611358642578\n",
      "Loss at step 67300 : 24.792171478271484\n",
      "Loss at step 67400 : 27.8779296875\n",
      "Loss at step 67500 : 21.294878005981445\n",
      "Loss at step 67600 : 23.710988998413086\n",
      "Loss at step 67700 : 26.69603729248047\n",
      "Loss at step 67800 : 22.266237258911133\n",
      "Loss at step 67900 : 20.324769973754883\n",
      "Loss at step 68000 : 17.123226165771484\n",
      "Loss at step 68100 : 21.980562210083008\n",
      "Loss at step 68200 : 21.33462905883789\n",
      "Loss at step 68300 : 21.619516372680664\n",
      "Loss at step 68400 : 17.771728515625\n",
      "Loss at step 68500 : 22.330350875854492\n",
      "Loss at step 68600 : 19.979232788085938\n",
      "Loss at step 68700 : 23.444244384765625\n",
      "Loss at step 68800 : 21.949960708618164\n",
      "Loss at step 68900 : 23.035593032836914\n",
      "Loss at step 69000 : 25.773710250854492\n",
      "Loss at step 69100 : 30.452312469482422\n",
      "Loss at step 69200 : 24.324636459350586\n",
      "Loss at step 69300 : 22.97249984741211\n",
      "Loss at step 69400 : 22.956371307373047\n",
      "Loss at step 69500 : 30.796377182006836\n",
      "Loss at step 69600 : 33.793827056884766\n",
      "Loss at step 69700 : 27.473756790161133\n",
      "Loss at step 69800 : 24.79217529296875\n",
      "Loss at step 69900 : 24.712038040161133\n",
      "Loss at step 70000 : 19.18488121032715\n",
      "Nearest to love: to, are, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, las, lazy, equals,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, teacher, to, comic, no,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 70100 : 17.68021011352539\n",
      "Loss at step 70200 : 19.692602157592773\n",
      "Loss at step 70300 : 22.715726852416992\n",
      "Loss at step 70400 : 28.078857421875\n",
      "Loss at step 70500 : 20.83727264404297\n",
      "Loss at step 70600 : 26.612810134887695\n",
      "Loss at step 70700 : 23.79532814025879\n",
      "Loss at step 70800 : 25.027074813842773\n",
      "Loss at step 70900 : 21.002206802368164\n",
      "Loss at step 71000 : 28.4522647857666\n",
      "Loss at step 71100 : 26.6592960357666\n",
      "Loss at step 71200 : 25.76645278930664\n",
      "Loss at step 71300 : 24.492948532104492\n",
      "Loss at step 71400 : 23.228832244873047\n",
      "Loss at step 71500 : 16.059778213500977\n",
      "Loss at step 71600 : 24.385805130004883\n",
      "Loss at step 71700 : 22.597850799560547\n",
      "Loss at step 71800 : 19.652488708496094\n",
      "Loss at step 71900 : 24.13005256652832\n",
      "Loss at step 72000 : 20.765993118286133\n",
      "Loss at step 72100 : 18.306570053100586\n",
      "Loss at step 72200 : 22.40850067138672\n",
      "Loss at step 72300 : 26.52080535888672\n",
      "Loss at step 72400 : 21.94305419921875\n",
      "Loss at step 72500 : 22.915035247802734\n",
      "Loss at step 72600 : 22.826435089111328\n",
      "Loss at step 72700 : 23.586137771606445\n",
      "Loss at step 72800 : 23.4814395904541\n",
      "Loss at step 72900 : 21.424156188964844\n",
      "Loss at step 73000 : 20.70807456970215\n",
      "Loss at step 73100 : 24.277915954589844\n",
      "Loss at step 73200 : 32.646305084228516\n",
      "Loss at step 73300 : 23.690542221069336\n",
      "Loss at step 73400 : 28.884153366088867\n",
      "Loss at step 73500 : 21.418039321899414\n",
      "Loss at step 73600 : 23.626989364624023\n",
      "Loss at step 73700 : 19.135255813598633\n",
      "Loss at step 73800 : 24.49765968322754\n",
      "Loss at step 73900 : 25.346330642700195\n",
      "Loss at step 74000 : 24.444597244262695\n",
      "Loss at step 74100 : 20.906719207763672\n",
      "Loss at step 74200 : 24.15581703186035\n",
      "Loss at step 74300 : 28.20793914794922\n",
      "Loss at step 74400 : 20.252531051635742\n",
      "Loss at step 74500 : 22.751426696777344\n",
      "Loss at step 74600 : 26.35929298400879\n",
      "Loss at step 74700 : 19.707244873046875\n",
      "Loss at step 74800 : 22.664331436157227\n",
      "Loss at step 74900 : 18.401601791381836\n",
      "Loss at step 75000 : 15.87525463104248\n",
      "Nearest to love: to, are, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, depends, las, lazy, equals,\n",
      "Nearest to sad: set, didnt, parking, prevalent, poignancy,\n",
      "Nearest to man: war, to, teacher, no, comic,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 75100 : 20.83124542236328\n",
      "Loss at step 75200 : 22.666231155395508\n",
      "Loss at step 75300 : 23.44501495361328\n",
      "Loss at step 75400 : 19.66627311706543\n",
      "Loss at step 75500 : 22.08147430419922\n",
      "Loss at step 75600 : 28.654211044311523\n",
      "Loss at step 75700 : 25.688133239746094\n",
      "Loss at step 75800 : 23.650941848754883\n",
      "Loss at step 75900 : 17.127418518066406\n",
      "Loss at step 76000 : 17.079771041870117\n",
      "Loss at step 76100 : 21.576339721679688\n",
      "Loss at step 76200 : 22.51148796081543\n",
      "Loss at step 76300 : 20.084821701049805\n",
      "Loss at step 76400 : 27.30356216430664\n",
      "Loss at step 76500 : 21.18718719482422\n",
      "Loss at step 76600 : 26.692922592163086\n",
      "Loss at step 76700 : 27.865522384643555\n",
      "Loss at step 76800 : 19.780139923095703\n",
      "Loss at step 76900 : 30.63093376159668\n",
      "Loss at step 77000 : 20.421619415283203\n",
      "Loss at step 77100 : 26.009307861328125\n",
      "Loss at step 77200 : 18.955902099609375\n",
      "Loss at step 77300 : 18.477779388427734\n",
      "Loss at step 77400 : 20.534141540527344\n",
      "Loss at step 77500 : 14.24122428894043\n",
      "Loss at step 77600 : 25.46961784362793\n",
      "Loss at step 77700 : 20.62984848022461\n",
      "Loss at step 77800 : 19.892213821411133\n",
      "Loss at step 77900 : 22.033306121826172\n",
      "Loss at step 78000 : 23.442014694213867\n",
      "Loss at step 78100 : 23.087827682495117\n",
      "Loss at step 78200 : 16.305042266845703\n",
      "Loss at step 78300 : 23.011402130126953\n",
      "Loss at step 78400 : 21.177793502807617\n",
      "Loss at step 78500 : 20.895797729492188\n",
      "Loss at step 78600 : 19.16598129272461\n",
      "Loss at step 78700 : 27.273799896240234\n",
      "Loss at step 78800 : 21.203018188476562\n",
      "Loss at step 78900 : 22.264108657836914\n",
      "Loss at step 79000 : 23.87984848022461\n",
      "Loss at step 79100 : 18.48876190185547\n",
      "Loss at step 79200 : 19.73760986328125\n",
      "Loss at step 79300 : 17.008073806762695\n",
      "Loss at step 79400 : 15.185075759887695\n",
      "Loss at step 79500 : 26.454200744628906\n",
      "Loss at step 79600 : 19.817020416259766\n",
      "Loss at step 79700 : 24.726543426513672\n",
      "Loss at step 79800 : 16.969724655151367\n",
      "Loss at step 79900 : 27.425222396850586\n",
      "Loss at step 80000 : 19.643749237060547\n",
      "Nearest to love: to, are, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, las, depends, lazy, equals,\n",
      "Nearest to sad: set, didnt, parking, prevalent, bad,\n",
      "Nearest to man: war, to, teacher, no, comic,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 80100 : 21.519346237182617\n",
      "Loss at step 80200 : 19.836231231689453\n",
      "Loss at step 80300 : 29.140249252319336\n",
      "Loss at step 80400 : 22.010852813720703\n",
      "Loss at step 80500 : 21.454591751098633\n",
      "Loss at step 80600 : 28.065351486206055\n",
      "Loss at step 80700 : 24.037395477294922\n",
      "Loss at step 80800 : 16.474594116210938\n",
      "Loss at step 80900 : 24.652137756347656\n",
      "Loss at step 81000 : 18.284265518188477\n",
      "Loss at step 81100 : 19.422019958496094\n",
      "Loss at step 81200 : 22.66421890258789\n",
      "Loss at step 81300 : 17.99226951599121\n",
      "Loss at step 81400 : 19.671968460083008\n",
      "Loss at step 81500 : 18.465496063232422\n",
      "Loss at step 81600 : 23.606201171875\n",
      "Loss at step 81700 : 24.730567932128906\n",
      "Loss at step 81800 : 18.348066329956055\n",
      "Loss at step 81900 : 23.06747817993164\n",
      "Loss at step 82000 : 27.35612678527832\n",
      "Loss at step 82100 : 17.069198608398438\n",
      "Loss at step 82200 : 21.35395050048828\n",
      "Loss at step 82300 : 16.525741577148438\n",
      "Loss at step 82400 : 23.016708374023438\n",
      "Loss at step 82500 : 17.294328689575195\n",
      "Loss at step 82600 : 20.075389862060547\n",
      "Loss at step 82700 : 21.279129028320312\n",
      "Loss at step 82800 : 19.273441314697266\n",
      "Loss at step 82900 : 25.09171485900879\n",
      "Loss at step 83000 : 23.321857452392578\n",
      "Loss at step 83100 : 30.017959594726562\n",
      "Loss at step 83200 : 22.247535705566406\n",
      "Loss at step 83300 : 19.803388595581055\n",
      "Loss at step 83400 : 19.410533905029297\n",
      "Loss at step 83500 : 18.383729934692383\n",
      "Loss at step 83600 : 15.605108261108398\n",
      "Loss at step 83700 : 21.054058074951172\n",
      "Loss at step 83800 : 21.353118896484375\n",
      "Loss at step 83900 : 23.235628128051758\n",
      "Loss at step 84000 : 14.604248046875\n",
      "Loss at step 84100 : 15.642258644104004\n",
      "Loss at step 84200 : 20.85807991027832\n",
      "Loss at step 84300 : 20.37868309020996\n",
      "Loss at step 84400 : 17.020095825195312\n",
      "Loss at step 84500 : 19.713674545288086\n",
      "Loss at step 84600 : 22.832992553710938\n",
      "Loss at step 84700 : 20.789295196533203\n",
      "Loss at step 84800 : 20.279773712158203\n",
      "Loss at step 84900 : 21.71385955810547\n",
      "Loss at step 85000 : 18.036733627319336\n",
      "Nearest to love: to, are, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, las, depends, lazy, equals,\n",
      "Nearest to sad: set, didnt, parking, prevalent, bad,\n",
      "Nearest to man: war, to, no, comic, teacher,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 85100 : 15.880188941955566\n",
      "Loss at step 85200 : 17.806726455688477\n",
      "Loss at step 85300 : 20.185714721679688\n",
      "Loss at step 85400 : 18.942676544189453\n",
      "Loss at step 85500 : 22.556926727294922\n",
      "Loss at step 85600 : 17.583168029785156\n",
      "Loss at step 85700 : 25.735332489013672\n",
      "Loss at step 85800 : 17.437305450439453\n",
      "Loss at step 85900 : 24.883909225463867\n",
      "Loss at step 86000 : 16.317909240722656\n",
      "Loss at step 86100 : 18.977853775024414\n",
      "Loss at step 86200 : 19.701210021972656\n",
      "Loss at step 86300 : 21.70062828063965\n",
      "Loss at step 86400 : 15.103374481201172\n",
      "Loss at step 86500 : 21.72690200805664\n",
      "Loss at step 86600 : 25.600086212158203\n",
      "Loss at step 86700 : 21.83480453491211\n",
      "Loss at step 86800 : 25.612789154052734\n",
      "Loss at step 86900 : 18.718351364135742\n",
      "Loss at step 87000 : 17.808277130126953\n",
      "Loss at step 87100 : 24.317811965942383\n",
      "Loss at step 87200 : 18.788557052612305\n",
      "Loss at step 87300 : 21.561830520629883\n",
      "Loss at step 87400 : 23.740589141845703\n",
      "Loss at step 87500 : 23.193557739257812\n",
      "Loss at step 87600 : 23.479555130004883\n",
      "Loss at step 87700 : 19.802108764648438\n",
      "Loss at step 87800 : 15.7124662399292\n",
      "Loss at step 87900 : 19.491727828979492\n",
      "Loss at step 88000 : 15.728858947753906\n",
      "Loss at step 88100 : 23.34300994873047\n",
      "Loss at step 88200 : 20.63688087463379\n",
      "Loss at step 88300 : 28.69689178466797\n",
      "Loss at step 88400 : 18.18400001525879\n",
      "Loss at step 88500 : 17.610965728759766\n",
      "Loss at step 88600 : 12.580883026123047\n",
      "Loss at step 88700 : 20.570737838745117\n",
      "Loss at step 88800 : 16.39702606201172\n",
      "Loss at step 88900 : 22.945280075073242\n",
      "Loss at step 89000 : 15.321630477905273\n",
      "Loss at step 89100 : 18.525548934936523\n",
      "Loss at step 89200 : 21.9448184967041\n",
      "Loss at step 89300 : 16.807605743408203\n",
      "Loss at step 89400 : 15.061017990112305\n",
      "Loss at step 89500 : 21.983293533325195\n",
      "Loss at step 89600 : 19.686019897460938\n",
      "Loss at step 89700 : 22.139020919799805\n",
      "Loss at step 89800 : 19.260210037231445\n",
      "Loss at step 89900 : 19.916181564331055\n",
      "Loss at step 90000 : 23.066158294677734\n",
      "Nearest to love: to, are, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, las, depends, lazy, equals,\n",
      "Nearest to sad: set, didnt, parking, bad, prevalent,\n",
      "Nearest to man: war, to, no, comic, a,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 90100 : 20.44590950012207\n",
      "Loss at step 90200 : 22.913448333740234\n",
      "Loss at step 90300 : 22.59736442565918\n",
      "Loss at step 90400 : 20.285425186157227\n",
      "Loss at step 90500 : 17.202096939086914\n",
      "Loss at step 90600 : 21.0109806060791\n",
      "Loss at step 90700 : 18.55284309387207\n",
      "Loss at step 90800 : 24.8129825592041\n",
      "Loss at step 90900 : 19.509607315063477\n",
      "Loss at step 91000 : 17.817514419555664\n",
      "Loss at step 91100 : 19.780841827392578\n",
      "Loss at step 91200 : 16.28580093383789\n",
      "Loss at step 91300 : 23.58007049560547\n",
      "Loss at step 91400 : 16.309391021728516\n",
      "Loss at step 91500 : 22.035343170166016\n",
      "Loss at step 91600 : 23.079496383666992\n",
      "Loss at step 91700 : 18.888551712036133\n",
      "Loss at step 91800 : 19.3596134185791\n",
      "Loss at step 91900 : 14.70510196685791\n",
      "Loss at step 92000 : 25.202804565429688\n",
      "Loss at step 92100 : 21.597745895385742\n",
      "Loss at step 92200 : 18.959903717041016\n",
      "Loss at step 92300 : 14.510472297668457\n",
      "Loss at step 92400 : 16.16798973083496\n",
      "Loss at step 92500 : 23.177692413330078\n",
      "Loss at step 92600 : 18.426855087280273\n",
      "Loss at step 92700 : 21.768394470214844\n",
      "Loss at step 92800 : 21.802766799926758\n",
      "Loss at step 92900 : 23.202808380126953\n",
      "Loss at step 93000 : 17.522972106933594\n",
      "Loss at step 93100 : 14.591439247131348\n",
      "Loss at step 93200 : 16.297624588012695\n",
      "Loss at step 93300 : 20.423763275146484\n",
      "Loss at step 93400 : 14.072681427001953\n",
      "Loss at step 93500 : 21.49339485168457\n",
      "Loss at step 93600 : 18.251235961914062\n",
      "Loss at step 93700 : 21.619060516357422\n",
      "Loss at step 93800 : 17.97752571105957\n",
      "Loss at step 93900 : 18.745023727416992\n",
      "Loss at step 94000 : 18.542173385620117\n",
      "Loss at step 94100 : 20.258668899536133\n",
      "Loss at step 94200 : 19.653804779052734\n",
      "Loss at step 94300 : 22.545942306518555\n",
      "Loss at step 94400 : 20.655200958251953\n",
      "Loss at step 94500 : 24.339353561401367\n",
      "Loss at step 94600 : 22.323801040649414\n",
      "Loss at step 94700 : 14.450552940368652\n",
      "Loss at step 94800 : 17.9737491607666\n",
      "Loss at step 94900 : 18.637332916259766\n",
      "Loss at step 95000 : 18.09946060180664\n",
      "Nearest to love: to, are, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, las, lazy, depends, equals,\n",
      "Nearest to sad: set, didnt, parking, bad, prevalent,\n",
      "Nearest to man: war, to, no, comic, a,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n",
      "Loss at step 95100 : 18.493324279785156\n",
      "Loss at step 95200 : 24.32549285888672\n",
      "Loss at step 95300 : 16.152202606201172\n",
      "Loss at step 95400 : 19.089920043945312\n",
      "Loss at step 95500 : 17.65999984741211\n",
      "Loss at step 95600 : 17.728878021240234\n",
      "Loss at step 95700 : 17.45740509033203\n",
      "Loss at step 95800 : 13.957781791687012\n",
      "Loss at step 95900 : 17.9846248626709\n",
      "Loss at step 96000 : 20.81214141845703\n",
      "Loss at step 96100 : 18.072418212890625\n",
      "Loss at step 96200 : 17.241106033325195\n",
      "Loss at step 96300 : 20.235698699951172\n",
      "Loss at step 96400 : 17.886627197265625\n",
      "Loss at step 96500 : 19.622528076171875\n",
      "Loss at step 96600 : 26.297531127929688\n",
      "Loss at step 96700 : 18.096921920776367\n",
      "Loss at step 96800 : 14.279419898986816\n",
      "Loss at step 96900 : 28.776090621948242\n",
      "Loss at step 97000 : 15.138348579406738\n",
      "Loss at step 97100 : 18.069015502929688\n",
      "Loss at step 97200 : 20.246334075927734\n",
      "Loss at step 97300 : 20.67560386657715\n",
      "Loss at step 97400 : 19.880565643310547\n",
      "Loss at step 97500 : 19.00636863708496\n",
      "Loss at step 97600 : 23.5047550201416\n",
      "Loss at step 97700 : 21.022214889526367\n",
      "Loss at step 97800 : 15.032499313354492\n",
      "Loss at step 97900 : 20.901275634765625\n",
      "Loss at step 98000 : 16.380409240722656\n",
      "Loss at step 98100 : 12.95431900024414\n",
      "Loss at step 98200 : 20.48422622680664\n",
      "Loss at step 98300 : 18.64830780029297\n",
      "Loss at step 98400 : 16.356403350830078\n",
      "Loss at step 98500 : 15.475266456604004\n",
      "Loss at step 98600 : 15.103370666503906\n",
      "Loss at step 98700 : 21.859590530395508\n",
      "Loss at step 98800 : 18.188095092773438\n",
      "Loss at step 98900 : 18.075307846069336\n",
      "Loss at step 99000 : 19.773866653442383\n",
      "Loss at step 99100 : 22.57672119140625\n",
      "Loss at step 99200 : 19.677322387695312\n",
      "Loss at step 99300 : 21.2425594329834\n",
      "Loss at step 99400 : 17.24368667602539\n",
      "Loss at step 99500 : 15.862784385681152\n",
      "Loss at step 99600 : 17.516103744506836\n",
      "Loss at step 99700 : 19.414125442504883\n",
      "Loss at step 99800 : 18.335098266601562\n",
      "Loss at step 99900 : 19.70181655883789\n",
      "Loss at step 100000 : 27.601322174072266\n",
      "Nearest to love: are, to, a, with, on,\n",
      "Nearest to hate: lifes, squandering, machine, me, juvenile,\n",
      "Nearest to happy: doug, las, lazy, depends, equals,\n",
      "Nearest to sad: set, didnt, parking, bad, prevalent,\n",
      "Nearest to man: war, to, no, comic, for,\n",
      "Nearest to woman: school, si, auteuil, stumbles, singular,\n",
      "Model saved in file: /home/nick/Documents/tensorflow/book_code/07_Natural_Language_Processing/07_Sentiment_Analysis_With_Doc2Vec/temp/doc2vec_movie_embeddings.ckpt\n"
     ]
    }
   ],
   "source": [
    "# Run the doc2vec model.\n",
    "print('Starting Training')\n",
    "loss_vec = []\n",
    "loss_x_vec = []\n",
    "for i in range(generations):\n",
    "    batch_inputs, batch_labels = text_helpers.generate_batch_data(text_data, batch_size,\n",
    "                                                                  window_size, method='doc2vec')\n",
    "    feed_dict = {x_inputs : batch_inputs, y_target : batch_labels}\n",
    "\n",
    "    # Run the train step\n",
    "    sess.run(train_step, feed_dict=feed_dict)\n",
    "\n",
    "    # Return the loss\n",
    "    if (i+1) % print_loss_every == 0:\n",
    "        loss_val = sess.run(loss, feed_dict=feed_dict)\n",
    "        loss_vec.append(loss_val)\n",
    "        loss_x_vec.append(i+1)\n",
    "        print('Loss at step {} : {}'.format(i+1, loss_val))\n",
    "      \n",
    "    # Validation: Print some random words and top 5 related words\n",
    "    if (i+1) % print_valid_every == 0:\n",
    "        sim = sess.run(similarity, feed_dict=feed_dict)\n",
    "        for j in range(len(valid_words)):\n",
    "            valid_word = word_dictionary_rev[valid_examples[j]]\n",
    "            top_k = 5 # number of nearest neighbors\n",
    "            nearest = (-sim[j, :]).argsort()[1:top_k+1]\n",
    "            log_str = \"Nearest to {}:\".format(valid_word)\n",
    "            for k in range(top_k):\n",
    "                close_word = word_dictionary_rev[nearest[k]]\n",
    "                log_str = '{} {},'.format(log_str, close_word)\n",
    "            print(log_str)\n",
    "            \n",
    "    # Save dictionary + embeddings\n",
    "    if (i+1) % save_embeddings_every == 0:\n",
    "        # Save vocabulary dictionary\n",
    "        with open(os.path.join(data_folder_name,'movie_vocab.pkl'), 'wb') as f:\n",
    "            pickle.dump(word_dictionary, f)\n",
    "        \n",
    "        # Save embeddings\n",
    "        model_checkpoint_path = os.path.join(os.getcwd(),data_folder_name,'doc2vec_movie_embeddings.ckpt')\n",
    "        save_path = saver.save(sess, model_checkpoint_path)\n",
    "        print('Model saved in file: {}'.format(save_path))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Now we can use the above embeddings to train a logistic model to predict sentiment.\n",
    "---------------------------\n",
    "\n",
    "Here are some parameters of the logistic model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "max_words = 20\n",
    "logistic_batch_size = 500"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Split dataset into train and test sets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Need to keep the indices sorted to keep track of document index\n",
    "train_indices = np.sort(np.random.choice(len(target), round(0.8*len(target)), replace=False))\n",
    "test_indices = np.sort(np.array(list(set(range(len(target))) - set(train_indices))))\n",
    "texts_train = [x for ix, x in enumerate(texts) if ix in train_indices]\n",
    "texts_test = [x for ix, x in enumerate(texts) if ix in test_indices]\n",
    "target_train = np.array([x for ix, x in enumerate(target) if ix in train_indices])\n",
    "target_test = np.array([x for ix, x in enumerate(target) if ix in test_indices])\n",
    "\n",
    "# Convert texts to lists of indices\n",
    "text_data_train = np.array(text_helpers.text_to_numbers(texts_train, word_dictionary))\n",
    "text_data_test = np.array(text_helpers.text_to_numbers(texts_test, word_dictionary))\n",
    "\n",
    "# Pad/crop movie reviews to specific length\n",
    "text_data_train = np.array([x[0:max_words] for x in [y+[0]*max_words for y in text_data_train]])\n",
    "text_data_test = np.array([x[0:max_words] for x in [y+[0]*max_words for y in text_data_test]])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we define our logistic model.  First the placeholders, then the embeddings (word and document embeddings from above training), and then our logistic regression operations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Define Logistic placeholders\n",
    "log_x_inputs = tf.placeholder(tf.int32, shape=[None, max_words + 1]) # plus 1 for doc index\n",
    "log_y_target = tf.placeholder(tf.int32, shape=[None, 1])\n",
    "\n",
    "# Define logistic embedding lookup (needed if we have two different batch sizes)\n",
    "# Add together element embeddings in window:\n",
    "log_embed = tf.zeros([logistic_batch_size, embedding_size])\n",
    "for element in range(max_words):\n",
    "    log_embed += tf.nn.embedding_lookup(embeddings, log_x_inputs[:, element])\n",
    "\n",
    "log_doc_indices = tf.slice(log_x_inputs, [0,max_words],[logistic_batch_size,1])\n",
    "log_doc_embed = tf.nn.embedding_lookup(doc_embeddings,log_doc_indices)\n",
    "\n",
    "# concatenate embeddings\n",
    "log_final_embed = tf.concat(axis=1, values=[log_embed, tf.squeeze(log_doc_embed)])\n",
    "\n",
    "# Define model:\n",
    "# Create variables for logistic regression\n",
    "A = tf.Variable(tf.random_normal(shape=[concatenated_size,1]))\n",
    "b = tf.Variable(tf.random_normal(shape=[1,1]))\n",
    "\n",
    "# Declare logistic model (sigmoid in loss function)\n",
    "model_output = tf.add(tf.matmul(log_final_embed, A), b)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Loss function, Prediction function, Optimization function and variable initializer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Declare loss function (Cross Entropy loss)\n",
    "logistic_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=model_output, labels=tf.cast(log_y_target, tf.float32)))\n",
    "\n",
    "# Actual Prediction\n",
    "prediction = tf.round(tf.sigmoid(model_output))\n",
    "predictions_correct = tf.cast(tf.equal(prediction, tf.cast(log_y_target, tf.float32)), tf.float32)\n",
    "accuracy = tf.reduce_mean(predictions_correct)\n",
    "\n",
    "# Declare optimizer\n",
    "logistic_opt = tf.train.GradientDescentOptimizer(learning_rate=0.01)\n",
    "logistic_train_step = logistic_opt.minimize(logistic_loss, var_list=[A, b])\n",
    "\n",
    "# Intitialize Variables\n",
    "init = tf.global_variables_initializer()\n",
    "sess.run(init)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we start our logistic regression training for sentiment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Starting Logistic Doc2Vec Model Training\n",
      "Generation # 500. Train Loss (Test Loss): 7.39 (7.18). Train Acc (Test Acc): 0.52 (0.49)\n",
      "Generation # 1000. Train Loss (Test Loss): 5.37 (5.51). Train Acc (Test Acc): 0.48 (0.51)\n",
      "Generation # 1500. Train Loss (Test Loss): 3.65 (3.86). Train Acc (Test Acc): 0.57 (0.56)\n",
      "Generation # 2000. Train Loss (Test Loss): 2.61 (3.02). Train Acc (Test Acc): 0.54 (0.50)\n",
      "Generation # 2500. Train Loss (Test Loss): 2.14 (2.59). Train Acc (Test Acc): 0.58 (0.51)\n",
      "Generation # 3000. Train Loss (Test Loss): 1.81 (2.16). Train Acc (Test Acc): 0.59 (0.54)\n",
      "Generation # 3500. Train Loss (Test Loss): 2.15 (2.43). Train Acc (Test Acc): 0.53 (0.52)\n",
      "Generation # 4000. Train Loss (Test Loss): 2.21 (2.20). Train Acc (Test Acc): 0.55 (0.54)\n",
      "Generation # 4500. Train Loss (Test Loss): 2.33 (2.91). Train Acc (Test Acc): 0.54 (0.52)\n",
      "Generation # 5000. Train Loss (Test Loss): 2.54 (2.65). Train Acc (Test Acc): 0.51 (0.50)\n",
      "Generation # 5500. Train Loss (Test Loss): 2.15 (2.62). Train Acc (Test Acc): 0.56 (0.49)\n",
      "Generation # 6000. Train Loss (Test Loss): 2.64 (3.06). Train Acc (Test Acc): 0.58 (0.52)\n",
      "Generation # 6500. Train Loss (Test Loss): 2.31 (3.16). Train Acc (Test Acc): 0.57 (0.46)\n",
      "Generation # 7000. Train Loss (Test Loss): 2.12 (2.57). Train Acc (Test Acc): 0.59 (0.57)\n",
      "Generation # 7500. Train Loss (Test Loss): 2.27 (2.69). Train Acc (Test Acc): 0.56 (0.52)\n",
      "Generation # 8000. Train Loss (Test Loss): 2.68 (3.28). Train Acc (Test Acc): 0.56 (0.46)\n",
      "Generation # 8500. Train Loss (Test Loss): 2.35 (3.17). Train Acc (Test Acc): 0.57 (0.47)\n",
      "Generation # 9000. Train Loss (Test Loss): 2.66 (3.17). Train Acc (Test Acc): 0.58 (0.54)\n",
      "Generation # 9500. Train Loss (Test Loss): 2.47 (2.75). Train Acc (Test Acc): 0.57 (0.51)\n",
      "Generation # 10000. Train Loss (Test Loss): 2.55 (2.92). Train Acc (Test Acc): 0.53 (0.52)\n"
     ]
    }
   ],
   "source": [
    "# Start Logistic Regression\n",
    "print('Starting Logistic Doc2Vec Model Training')\n",
    "train_loss = []\n",
    "test_loss = []\n",
    "train_acc = []\n",
    "test_acc = []\n",
    "i_data = []\n",
    "for i in range(10000):\n",
    "    rand_index = np.random.choice(text_data_train.shape[0], size=logistic_batch_size)\n",
    "    rand_x = text_data_train[rand_index]\n",
    "    # Append review index at the end of text data\n",
    "    rand_x_doc_indices = train_indices[rand_index]\n",
    "    rand_x = np.hstack((rand_x, np.transpose([rand_x_doc_indices])))\n",
    "    rand_y = np.transpose([target_train[rand_index]])\n",
    "    \n",
    "    feed_dict = {log_x_inputs : rand_x, log_y_target : rand_y}\n",
    "    sess.run(logistic_train_step, feed_dict=feed_dict)\n",
    "    \n",
    "    # Only record loss and accuracy every 100 generations\n",
    "    if (i+1)%100==0:\n",
    "        rand_index_test = np.random.choice(text_data_test.shape[0], size=logistic_batch_size)\n",
    "        rand_x_test = text_data_test[rand_index_test]\n",
    "        # Append review index at the end of text data\n",
    "        rand_x_doc_indices_test = test_indices[rand_index_test]\n",
    "        rand_x_test = np.hstack((rand_x_test, np.transpose([rand_x_doc_indices_test])))\n",
    "        rand_y_test = np.transpose([target_test[rand_index_test]])\n",
    "        \n",
    "        test_feed_dict = {log_x_inputs: rand_x_test, log_y_target: rand_y_test}\n",
    "        \n",
    "        i_data.append(i+1)\n",
    "\n",
    "        train_loss_temp = sess.run(logistic_loss, feed_dict=feed_dict)\n",
    "        train_loss.append(train_loss_temp)\n",
    "        \n",
    "        test_loss_temp = sess.run(logistic_loss, feed_dict=test_feed_dict)\n",
    "        test_loss.append(test_loss_temp)\n",
    "        \n",
    "        train_acc_temp = sess.run(accuracy, feed_dict=feed_dict)\n",
    "        train_acc.append(train_acc_temp)\n",
    "    \n",
    "        test_acc_temp = sess.run(accuracy, feed_dict=test_feed_dict)\n",
    "        test_acc.append(test_acc_temp)\n",
    "    if (i+1)%500==0:\n",
    "        acc_and_loss = [i+1, train_loss_temp, test_loss_temp, train_acc_temp, test_acc_temp]\n",
    "        acc_and_loss = [np.round(x,2) for x in acc_and_loss]\n",
    "        print('Generation # {}. Train Loss (Test Loss): {:.2f} ({:.2f}). Train Acc (Test Acc): {:.2f} ({:.2f})'.format(*acc_and_loss))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here is matplotlib code for plotting the train/test loss and accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f24f0f27cc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nAHfddRdiYmIQFRWFvn374vLly/jnP/+J3bt3495774XZbMZMdT4/K3v27EH//v3RqVMnAFyGeOLE\niWjQoAEATi//j3/8Ay1btkTTpk3xwAMPoLS0FFlZWbjtttuQmppq06yys7MNr2fTpk3Izc3Fyy+/\njPfff9/h2hYuXGgrQ9y1a1ccOnQIAHD69GmMGDECsbGxiIuLs7X/X//6F6ZOnWo7/ujRo6hXr57t\ne9++fTF79mz06dMHYWFhyMzMxOLFi22/0a5dO7z77ruaNqxZswZdu3ZFREQE2rdvj23btuH999/H\nNddco9lv3rx5uPvuu53856oJ/qogVlULAKLDh4lYZ+HFWklOIqmOoKLqjupnWb14sn8lMaog+fzz\nz9OAAQPo3LlzVFxcTJMmTaLJkycTEdF//vMfuv3226m4uJjKy8tpz549VFBQQEREffr0oVWrVjn9\nrc2bN1NYWBg988wztGvXLiopKdFsnzZtGt1+++2Um5tLubm5NHToUHrmmWeIiOjrr7+2VY50xT33\n3EMTJkygwsJCMpvN9NVXX9m2rVixgpKSkmj//v1ERHTs2DHKyMig0tJS6tixIz322GNUWFhIRUVF\ntGvXLiIievTRR+mvf/2r7RxHjhyhevXq2b736dOHkpOT6fjx47YyxOvWrbNV09yyZQuFhITQb7/9\nRkRcATMqKop27NhBRERpaWl0/Phxys/Pp4iICPr9999t5+7UqZOm/RXh7HmDLE1cgWDJyiJavpzo\njTeI5s0j+s9/3L3nEkmVU1MFS6tWrWz13YmIUlNTKTQ0lIiIFi5cSIMGDaKDBw86nKtPnz60cuVK\nl7+3bt06uvXWWykiIoIiIiJo1qxZRMTljevXr09nz5617btt2zbq2LEjEbknWHJzcyk0NJT+97//\nERHRxIkTacyYMbbtAwcOpCVLljgct23bNmrevLnhOd0RLM8//7zLdg0dOpQWL15MREQTJkygxx57\nzHC/yZMn07PPPktERLt376b4+HgqLy93eW41gRAsfp+IEEIMBfAa2Oy2jIgMq98IIUYD+AhATyLa\nK4RIBHAYwBHrLj8Q0d8MfyQqCqiGNQkkktpEWloabr75ZtucBvdNQFZWFqZMmYJz585h9OjRyM/P\nx7hx4/Dss8+6XYPl1ltvxa233gqAzVajR49GSkoKBg0ahNLSUqSkpNj2tVgsqF+/vtvt/uijj2A2\n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\n9wUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f24f0f498d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot loss over time\n",
    "plt.plot(i_data, train_loss, 'k-', label='Train Loss')\n",
    "plt.plot(i_data, test_loss, 'r--', label='Test Loss', linewidth=4)\n",
    "plt.title('Cross Entropy Loss per Generation')\n",
    "plt.xlabel('Generation')\n",
    "plt.ylabel('Cross Entropy Loss')\n",
    "plt.legend(loc='upper right')\n",
    "plt.show()\n",
    "\n",
    "# Plot train and test accuracy\n",
    "plt.plot(i_data, train_acc, 'k-', label='Train Set Accuracy')\n",
    "plt.plot(i_data, test_acc, 'r--', label='Test Set Accuracy', linewidth=4)\n",
    "plt.title('Train and Test Accuracy')\n",
    "plt.xlabel('Generation')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend(loc='lower right')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To make improvements, we should focus on improving the doc2vec embeddings.  Potential doc2vec improvements may come with stemming of words, expanding stop words, and more training.\n",
    "\n",
    "And for improving the logistic regression, we could add a hidden layer and also increase batch size and exponentially reduce the learning rate."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
